#include "stringtable.h"

StringTable::StringTable()
    : QList<QStringList>()
    , m_columnCount(0)
{
}

StringTable::StringTable(int rows, int columns)
    : QList<QStringList>()
    , m_columnCount(columns)
{
    reserve(rows);

    // Prepare list of empty values
    QStringList list;
    for(int i = 0; i < columns; i++)
        list << "";

    // Populate the table by empty rows
    for(int i = 0; i < rows; i++)
        append(list);
}

void StringTable::clear()
{
    QList<QStringList>::clear();
    m_columnCount = 0;
}

const QString& StringTable::cellAt(int row, int column) const
{
    return at(row).at(column);
}

void StringTable::setCell(int row, int column, const QString &value)
{
    (*this)[row][column] = value;
}

int StringTable::columnCount() const
{
    return m_columnCount;
}

void StringTable::setColumnCount(int columns)
{
    appendColumns(columns);
}

int StringTable::rowCount() const
{
    return size();
}

void StringTable::setRowCount(int rows)
{
    appendRows(rows - rowCount());
}

void StringTable::appendRows(int count)
{
    reserve(rowCount() + count);

    // Prepare list of empty values
    QStringList list;
    for(int i = columnCount() - 1; i >= 0; i--)
        list << "";

    for(int i = 0; i < count; i++)
        append(list);
}

void StringTable::appendColumns(int count)
{
    m_columnCount += count;
    
    for(int i = rowCount() - 1; i >= 0; i--)
        for(int j = 0; j < count; j++)
            (*this)[i].append("");
}

void StringTable::insertRows(int row, int count)
{
    reserve(rowCount() + count);

    // Prepare list of empty values
    QStringList list;
    for(int i = columnCount() - 1; i >= 0; i--)
        list << "";

    // Insert new empty rows
    for(int i = 0; i < count; i++)
        insert(row, list);
}

void StringTable::insertColumns(int column, int count)
{
    m_columnCount += count;

    // Insert in every row empty cells
    for(int i = rowCount() - 1; i >= 0; i--)
        for(int j = 0; j < count; j++)
            (*this)[i].insert(column, "");
}

void StringTable::removeRows(int row, int count)
{
    // Insert new empty rows
    for(int i = 0; i < count; i++)
        removeAt(row);
}

void StringTable::removeColumns(int column, int count)
{
    m_columnCount -= count;

    // Insert in every row empty cells
    for(int i = rowCount() - 1; i >= 0; i--)
        for(int j = 0; j < count; j++)
            (*this)[i].removeAt(column);
}

QStringList StringTable::column(int pos) const
{
    QStringList ret;
    int max = rowCount();
    for(int i = 0; i < max; i++)
        ret << cellAt(i, pos);
    return ret;
}

void StringTable::setColumn(int pos, const QStringList &column)
{
    for(int i = rowCount() - 1; i >= 0; i--)
        (*this)[i][pos] = column[i];
}

void StringTable::appendColumn(const QStringList &column)
{
    m_columnCount++;

    for(int i = rowCount() - 1; i >= 0; i--)
        (*this)[i].append(column[i]);
}

QStringList StringTable::row(int pos) const
{
    return (*this)[pos];
}

void StringTable::appendRow(const QStringList &row)
{
    int n = rowCount();
    appendRows();
    for(int i = columnCount() - 1; i >= 0; i--)
        (*this)[n][i] = row[i];
}
